import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '../store/index'
import { getToken } from '@/utils/auth';

// 创建axios实例
const service = axios.create({
    baseURL: process.env.VUE_APP_BASE_API, //URL地址   环境变量文件 .env.development
    timeout: 5000 ,//超时
    withCredentials: true,  //跨域时若要发生cookie,需要设置该选项
})

// 请求拦截器
service.interceptors.request.use(
    config => {

        if(store.getters.token){
            // 设置令牌请求头
            config.headers['Authorization'] = getToken()
        }
        return config
    },
    error => {
        return Promise.reject(error)
    }
)

// 相应拦截
service.interceptors.response.use(
    // 通过自定义status 判定响应状态 也可以通过HTTP状态码判断
    response =>{
        const res = response.data
       
        // 浏览器弹窗弹出excle文件
        const contentType = response.headers['content-type'];
        if (contentType === "application/vnd.ms-excel;charset=utf-8") {
            let blob = new Blob([response.data], { type: 'application/vnd.ms-excel' });
            let url = window.URL.createObjectURL(blob);
            const link = document.createElement('a'); // 创建a标签
            link.href = url;
            link.click();
            URL.revokeObjectURL(url); // 释放内存
            return
        }

        // status 不为0 则判断为一个错误
        if(res.status !== 200){
        
            // 登录失效
            if(res.status === 201 || res.status === 202 || res.status === 203 || res.status === 204 || res.status === 205){
                // store.dispatch('user/resetToken').then(()=>{
                //     location.reload()
                // })
                // 重新登陆
                MessageBox.confirm(
                    '登录过期，请重新登录',
                    "确认登录信息",
                    {
                        confirmButtonText: '重新登录',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }
                ).then(()=>{
                    store.dispatch('user/resetToken')
                        .then(()=>{
                            location.reload()
                        })
                })
            } else {
                Message({
                    message: res.message || "系统错误，请联系管理员！",
                    type: 'error',
                    duration: 5*1000
                })
            }

            return Promise.reject(new Error(res.message || '系统错误，请联系管理员！'));
    
        }else{
            return res;
        }
    },
    error =>{
        Message({
            message: error.message,
            type: 'error',
            duration: 5*1000
        })
    }
)

export default service;